package com.liunian.algorithmstudy.tree;

public class DeleteNode450 extends TreeNode {

    /**
     给定一个二叉搜索树的根节点 root 和一个值 key，删除二叉搜索树中的 key 对应的节点，并保证二叉搜索树的性质不变。
     返回二叉搜索树（有可能被更新）的根节点的引用。

     一般来说，删除节点可分为两个步骤：

     首先找到需要删除的节点；
     如果找到了，删除它。
     */
    public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null) {
            return null;
        } else if (root.val == key) {
            if (root.left == null && root.right == null) {
                return null;
            } else if (root.left == null) {
                return root.right;
            } else if (root.right == null) {
                return root.left;
            } else {
                buildTree(root.left, root.right);
                return root.left;
            }
        }

        if (root.val > key) {
            root.left = deleteNode(root.left, key);
        }
        if (root.val < key) {
            root.right = deleteNode(root.right, key);
        }
        return root;
    }

    private void buildTree(TreeNode left, TreeNode right) {
        if (left.right == null) {
            left.right = right;
            return;
        }
        buildTree(left.right, right);
    }
}